package a00_LeetCode.Queue;

import java.util.Queue;
import java.util.Stack;

/**
 * @Author quan
 * @Description 双栈实现队列
 * @Date 2023/3/23 17:21
 */
public class Num232_MyStackByQueue {
    /**
     * 主要思想：s1存放所有的元素，s2作为辅助。我们的目标是希望将新元素存在s1的栈底，如果s1中没有元素，那直接存；但是
     * 如果s1中有元素，就将s1中的所有元素全部弹出先存到s2中，再将新元素存入s1，此时新元素就处于s1的栈底。
     * 然后，我们再将s2中的元素全部弹出压入s1中。即符合出队列的特点。
     */
    //先创建两个栈：s1存储所有元素，s2出栈
    Stack<Integer> s1 = new Stack<>();
    Stack<Integer> s2 = new Stack<>();
    //入栈
    public void push(int x) {
        //如果s1中有元素，先弹出将栈底空出来
        while (!s1.isEmpty()){
            s2.push(s1.pop());
        }
        //将x添加到s1的栈底
        s1.push(x);
        //将s2的值依次弹出来压入到s1中
        while (!s2.isEmpty()){
            s1.push(s2.pop());
        }
    }

    public int pop() {
        return s1.pop();
    }

    public int peek() {
        return s1.peek();
    }

    public boolean empty() {
        return s1.isEmpty();
    }
}
